package com.gupao.userssoclient.interceptor;

import com.gupao.userssoclient.util.HttpUtil;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //在user.com中是否有 局部session对象
        /**
         * 一个小知识点：
         *  HttpSession session = request.getSession();  直接取session
         *  HttpSession session = request.getSession(true);  有session使用当前，没有session创新session
         *  HttpSession session = request.getSession(false); 有session使用当前，没有为null
         *
         *  使用：
         *  当向Session中存取登录信息时，一般建议：HttpSession session =request.getSession();
         *  当从Session中获取登录信息时，一般建议：HttpSession session =request.getSession(false);
         */
        HttpSession session = request.getSession(false);
        if (session !=null&&session.getAttribute("login").equals("login")) {
            return true;
        }

        //第一次登录到sso 然后回来之后，发现有token了（从回调地址就能看出来）（但是依然没有session，因为只有第二次访问才会有session）
        String token = request.getParameter("token");
        System.out.println(token);
        //这里是校验token的真伪撒，因为在第一步浏览器输入的时候，完全可以随便伪造token撒
        if (token != null) {
            String reqUrl = "http://www.sso.com:8090/checkToken";
            String content = "token=" + token;
            String result = HttpUtil.sendReq(reqUrl, content);
            if ("correct".equals(result)) {
                //user.com中创建局部session会话
                request.getSession().setAttribute("login", "login");
                return true;
            }
        }

        //表示当你需要访问某个user.com下面的保护资源时，
        // 既没有局部session会话信息（注意全局session根本就不是在这里验证），
        // 又没有sso颁发给你的token
        response.sendRedirect("http://www.sso.com:8090/preLogin?url=www.user.com:8081/user/wel");
        return false;
    }
}
